package java学习.第12章_集合框架;

import org.junit.Test;

import java.util.*;

/**
 * ➢Map接口:双列数据，保存具有映射关系“key-value对”的集合JDK1.2
 *          方法：HashMap、LinkedHashMap、TreeMap、Hashtable、Properties
 *
 *      HashMap    //JDK1.2          线程不安全  速度快  可存储null的key-value
 *           LinkedHashMap//JDK1.4  遍历比HashMap快
 *           可保证顺序遍历  在HashMap的基础上  加了一对指针 指向前一个和后一个元素
 *
 *      Hashtable//JDK1.0古老的实现类  线程安全  速度慢    不可存储null的key-value
 *           Properties//常用来处理配置文件   key-value都是String
 *
 *      TreeMap//JDK1.2 保证按照添加的key-value对进行排序，实现排序遍历。 用key进行排序的
 *             //二叉树存储   红黑树 特点:有序，
 *
 * 二、Map 结构的理解:
 *    Map中的key:无序的、不可重复的，使用Set 存储所有的key
 *          //重写hashCode()和equals方法
 *    Map中的value:无序的、可重复的，使用Collection存 储所有的value//重写equals方法
 *           -个键值对: key-value 构成了一个Entry对象 。
 *    Map中的entry:无序的、不可重复的，使用Set 存储所有的entry
 */
public class C1_Map {
    /**
     * 增：put(K key, V value)
     *    putAll(Map m)
     * 删除：remove(K key); //删除 key  并返回value的值
     *      clear()： 清空
     * 改：put(K key, V value)  存在修改 value   不存在添加
     *
     * 长度：size()  返回元素个数
     */
    @Test
    public void Map的普通方法增删改() {
        Map map = new HashMap();
        map.put(1,"AA");
        map.put(null,null);
        map.put(2,"bb");
        map.put("CC",3);
        map.put(2,"BB");//2 这个key相同  把新的value修改成新的
        System.out.println(map);//{null=null, CC=3, 1=AA, 2=BB}

        Map map1 = new HashMap();
        map1.put("dd",8);
        map1.put("90",56);

        map.putAll(map1);//合集  把map1的Map全添加到map里
        System.out.println(map);//{null=null, CC=3, dd=8, 1=AA, 2=BB, 90=56}

        System.out.println("***********remove**删除*************************");
        Object value = map.remove("dd");//删除key为dd的key  并返回value的值
        System.out.println(value);//8   没有返回null
        System.out.println(map);//{null=null, CC=3, 1=AA, 2=BB, 90=56}
        System.out.println("***********clear**清空*************************");
        /**
         *     public void clear() {
         *         Node<K,V>[] tab;
         *         modCount++;
         *         if ((tab = table) != null && size > 0) {
         *             size = 0;
         *             for (int i = 0; i < tab.length; ++i)
         *                 tab[i] = null;
         *         }
         *     }
         */
        map.clear();//清空map
        System.out.println(map.size());//0   获取map的对数
        System.out.println(map);//{}
    }

    /**
     *
     * 查 ： containsKey(Object key)   查询是否存在次 key
     *      containsValue(Object value)  查询是否存在次 value
     *      get(Object key)   查询次 key 的值  不存在为 null
     *
     *      equals()  是否相同
     *      isEmpty() 判断是否为空
     */
    @Test
    public void Map的普通方法2() {
        Map map = new HashMap();

        map.put(1,"AA");
        map.put(2,"bb");
        map.put("CC",3);
        map.put(2,"BB");//2 这个key相同  把新的value修改成新的
        System.out.println(map);//{CC=3, 1=AA, 2=BB}
        System.out.println(map.get(2));//BB  根据key  返回对应的value
        System.out.println("*********是否包含指定的Key或Value*******************************");
        System.out.println(map.containsKey(3));//false
        System.out.println(map.containsValue(3));//true
        System.out.println(map.equals(map));//true  判断map是否相等
        System.out.println(map.isEmpty());//false 判断map是否为空
    }

    @Test
    public void Map的遍历() {
        HashMap<Object, Object> map = new HashMap();

        map.put(1, "AA");
        map.put(2, "bb");
        map.put("CC", 3);
        map.put(2, "BB");//2 这个key相同  把新的value修改成新的
        System.out.println(map);//{CC=3, 1=AA, 2=BB}

        System.out.println("******************把Map的Key-value提取出来*****************************");
        Set set = map.keySet();//把Map的key转换成Set
        System.out.println(set);//[CC, 1, 2]
        Collection values = map.values();//把Map的value转换成Collection集合
        System.out.println(values);//[3, AA, BB]

        Set entrySet = map.entrySet();//返回的类型  Set<Map.Entry<K, V>>
        System.out.println(entrySet);//[CC=3, 1=AA, 2=BB]
        Iterator iterator = entrySet.iterator();
        while (iterator.hasNext()) {
            Object obj = iterator.next();
            Map.Entry entry = (Map.Entry) obj;//Map.Entry 内部接口
            System.out.println(entry.getKey() + "\t" + entry.getValue());//内部接口的方法（）
        } //这种遍历方式 速度快 效率高

        for (Object set1 : map.entrySet()) {
            Map.Entry entry = (Map.Entry) set1;//Map.Entry 内部接口
            System.out.println(entry.getKey() + "         " + entry.getValue());
        }

        //有泛型  才可以这样遍历
        for (Map.Entry entry : map.entrySet()) {
            System.out.println(entry.getKey() + "         " + entry.getValue());
        }
    }

}

